home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LIBRARY / BPL70N16 / TESTPRGS.ZIP / LLL.PAS < prev    next >
Pascal/Delphi Source File  |  1993-02-14  |  13KB  |  477 lines

  1. {$A+,B-,D-,E-,F-,G-,I-,L-,N+,O-,R-,S-,V-,X-}
  2. {$M 16384,0,655360}
  3.  
  4. {    LAWRENCE LIVERMORE LOOPS (LLL) }
  5.  
  6. {    PORTED TO TURBO-PASCAL 5.0 AND ENHANCED TO ALLOW FOR VARIABLE
  7.      LOOPING 89-05-27 BY N.J.
  8.  
  9. ***********************************************************************
  10.  
  11.      PROGRAM ANALYSIS EVALUATES EXECUTION RATES OF PASCAL FOR-LOOPS.
  12.      THROUGH-PUT IS MEASURED IN UNITS OF MILLIONS OF FLOATING-POINT
  13.      OPERATIONS PER SECOND, CALLED MFLOPS.
  14.  
  15.  
  16. ***********************************************************************
  17.  
  18. ***********************************************************************}
  19.  
  20. PROGRAM LLL;
  21.  
  22. USES Time;
  23.  
  24. CONST REPS = 10;
  25.  
  26.  
  27. VAR
  28.  
  29. NT,IR,IX,IZ13,IZ14,IP,
  30. I1,J1,I2,J2,NL1,NL2,
  31. I,J,K,L,M,K1,KX,KY,LW,
  32. IT1:                     LONGINT;
  33. S,RI,XI,DU1,DU2,DU3,
  34. Q,R,T,A11,A12,A13,
  35. SIG,A21,A22,A23,A31,
  36. A32,A33,BM28,BM27,
  37. AR,BR,CR,BM26,BM25,BM24,
  38. BM23,BM22,C0,FLX,RX1:    DOUBLE;
  39. IDT,MOPS:                ARRAY [1..20] OF LONGINT;
  40. RT,RPM:                  ARRAY [1..20] OF DOUBLE;
  41. X,Y,Z,U:                 ARRAY [1..1000] OF DOUBLE;
  42. PX,CX:                   ARRAY [1..15,1..100] OF DOUBLE ABSOLUTE Z;
  43. U1,U2,U3:                ARRAY [1..22,1..5,1..2] OF DOUBLE;
  44. B,C,H:                   ARRAY [1..64,1..8] OF DOUBLE;
  45. BNK1,BNK2,BNK3,BNK4,BNK5:ARRAY [1..5] OF DOUBLE;
  46. P:                       ARRAY [1..4,1..512] OF DOUBLE ABSOLUTE X;
  47. E,F:                     ARRAY [1..192] OF LONGINT;
  48. EX,RH,DEX:               ARRAY [1..67] OF DOUBLE;
  49. VX,XX:                   ARRAY [1..150] OF DOUBLE;
  50.  
  51. CONST
  52.  
  53. NROPS: ARRAY [1..20] OF LONGINT =
  54.        (5,10,2,3,2,3,16,36,17,9,1,1,7,11,0,0,0,0,0,0);
  55. LOOPS: ARRAY [1..20] OF LONGINT =
  56.        (400,200,1000,343,996,996,120,40,100,100,999,999,128,150,0,0,0,0,0,0);
  57.  
  58.  
  59. {***********************************************************************}
  60.  
  61. BEGIN
  62.  
  63.    WRITELN ('-- LAWRENCE LIVERMORE LOOPS --');
  64.    WRITELN;
  65.  
  66.    FOR K := 1 TO 1000 DO BEGIN
  67.       U[K] := 0.00025;
  68.       X[K] := 1.11;
  69.       Y[K] := 1.123;
  70.       Z[K] := 0.321;
  71.    END;
  72.  
  73.    FOR J := 1 TO 22 DO BEGIN
  74.       FOR K := 1 TO 5 DO BEGIN
  75.          FOR L := 1 TO 2 DO BEGIN
  76.             U1[J,K,L] := K;
  77.             U2[J,K,L] := K + K;
  78.             U3[J,K,L] := K + K + K;
  79.          END;
  80.       END;
  81.    END;
  82.  
  83.  
  84.    FOR J := 1 TO 64 DO BEGIN
  85.       FOR K := 1 TO 8 DO BEGIN
  86.          B[J,K] := 1.00025;
  87.          C[J,K] := 1.00025;
  88.          H[J,K] := 1.00025;
  89.       END;
  90.    END;
  91.  
  92.    FOR J := 1 TO 5 DO BEGIN
  93.       BNK1[J] := J*100;
  94.       BNK2[J] := J*110;
  95.       BNK3[J] := J*120;
  96.       BNK4[J] := J*130;
  97.       BNK5[J] := J*140;
  98.    END;
  99.  
  100.    FOR J := 1 TO 192 DO BEGIN
  101.       E[J] := 1;
  102.       F[J] := 1;
  103.    END;
  104.  
  105.  
  106.    FOR J := 1 TO 67 DO BEGIN
  107.       EX[J] := J;
  108.       RH[J] := J;
  109.       DEX[J]:= J;
  110.    END;
  111.  
  112.    FOR J := 1 TO 150 DO BEGIN
  113.       VX[J] := 0.001;
  114.       XX[J] := 0.001;
  115.    END;
  116.  
  117.    R := 4.86;
  118.    T := 276.0;
  119.    A11 := 0.5;
  120.    A12 := 0.33;
  121.    A13 := 0.25;
  122.    SIG := 0.8;
  123.    A21 := 0.20;
  124.    A22 := 0.167;
  125.    A23 := 0.141;
  126.    A31 := 0.125;
  127.    A32 := 0.111;
  128.    A33 := 0.10;
  129.    BM28 := 0.1;
  130.    BM27 := 0.2;
  131.    BM26 := 0.3;
  132.    BM25 := 0.4;
  133.    BM24 := 0.5;
  134.    BM23 := 0.6;
  135.    BM22 := 0.7;
  136.    C0 := 0.8;
  137.    FLX := 4.689;
  138.    RX1 := 64.0;
  139.  
  140. {********************************************************************
  141.  
  142.      END OF INITIALIZATION--BEGIN TIMING
  143.  
  144. {********************************************************************}
  145.  
  146. {*** LOOP 1    HYDRO EXCERPT }
  147.  
  148.       IT1 := CLOCK;
  149.       FOR K1 := 1 TO REPS DO BEGIN
  150.          Q := 0.0;
  151.          I := 10;
  152.          FOR K := 1 TO 400 DO BEGIN
  153.             X[K] := Q+Y[K]*(R*Z[K+I]+T*Z[K+I+1]);
  154.          END;
  155.       END;
  156.       IDT[1] := CLOCK - IT1;
  157.  
  158. {*********************************************************************}
  159.  
  160. {*** LOOP2     MLR, INNER PRODUCT }
  161.  
  162.       IT1 := CLOCK;
  163.       FOR K1 := 1 TO REPS DO BEGIN
  164.          Q := 0.0;
  165.          K := 1;
  166.          WHILE K <= 996 DO BEGIN
  167.             Q := Q+Z[K  ]*X[K  ]+Z[K+1]*X[K+1]
  168.                   +Z[K+2]*X[K+2]+Z[K+3]*X[K+3]
  169.                   +Z[K+4]*X[K+4];
  170.             INC (K,5);
  171.          END;
  172.       END;
  173.       IDT [2] := CLOCK - IT1;
  174.  
  175. {*********************************************************************}
  176.  
  177. {*** LOOP 3    INNER PROD }
  178.  
  179.       IT1 := CLOCK;
  180.       FOR K1 := 1 TO REPS DO BEGIN
  181.          Q := 0.0;
  182.          FOR K := 1 TO 1000 DO BEGIN
  183.             Q := Q+Z[K]*X[K];
  184.          END;
  185.       END;
  186.       IDT[3] := CLOCK - IT1;
  187.  
  188. {*********************************************************************}
  189.  
  190. {*** LOOP 4    BANDED LINEAR EQUATIONS }
  191.  
  192.       IT1 := CLOCK;
  193.       FOR K1 := 1 TO REPS DO BEGIN
  194.          L := 7;
  195.          WHILE L <= 107 DO BEGIN
  196.             LW := L;
  197.             J := 30;
  198.             WHILE J <= 870 DO BEGIN
  199.                X[L-1] := X[L-1] - X[LW]*Y[J];
  200.                INC (J,5);
  201.                INC (LW);
  202.             END;
  203.             X[L-1] := Y[5]*X[L-1];
  204.             INC (L,50);
  205.          END;
  206.       END;
  207.       IDT[4] := CLOCK - IT1;
  208.  
  209. {*********************************************************************}
  210.  
  211. {*** LOOP5 }
  212.  
  213.       IT1 := CLOCK;
  214.       FOR K1 := 1 TO REPS DO BEGIN
  215.          I := 2;
  216.          WHILE I <= 997 DO BEGIN
  217.             X[I  ] := Z[I  ]*(Y[I  ]-X[I-1]);
  218.             X[I+1] := Z[I+1]*(Y[I+1]-X[I  ]);
  219.             X[I+2] := Z[I+2]*(Y[I+2]-X[I+1]);
  220.             INC (I,3);
  221.          END;
  222.       END;
  223.       IDT[5] := CLOCK - IT1;
  224.  
  225. {*********************************************************************}
  226.  
  227. {*** LOOP6     TRI-DIAGONAL ELIMINATION, ABOVE DIAGONAL }
  228.  
  229.       IT1 := CLOCK;
  230.       FOR K1 := 1 TO REPS DO BEGIN
  231.          J := 3;
  232.          WHILE J <= 997 DO BEGIN
  233.             I := 1000-J;
  234.             X[I  ] := X[I  ]-Z[I  ]*X[I+1];
  235.             X[I-1] := X[I-1]-Z[I-1]*X[I  ];
  236.             X[I-2] := X[I-2]-Z[I-2]*X[I-1];
  237.             INC (J,3);
  238.          END;
  239.  
  240. { THE FOLLOWING LOOP HAS BEEN INSERTED AT THE UNIVERSITY
  241.   OF COLOGNE, BECAUSE IN THE ORIGINAL VERSION LOOP 6 ABORTED
  242.   WITH EXPONENT OVERFLOW ON IBM SYSTEMS. }
  243.  
  244.          FOR J := 2 TO 997 DO BEGIN
  245.             X[J]:=X[J]*0.6666;
  246.          END;
  247.  
  248.       END;
  249.  
  250.       IDT[6] := CLOCK - IT1;
  251.  
  252. {*********************************************************************}
  253.  
  254. {*** LOOP7     EQUATION OF STATE EXCERPT }
  255.  
  256.       IT1 := CLOCK;
  257.       FOR K1 := 1 TO REPS DO BEGIN
  258.          FOR M := 1 TO 120 DO BEGIN
  259.             X[M] :=    U[M  ] + R*(Z[M  ] + R*Y[M  ])
  260.                    +T*(U[M+3] + R*(U[M+2] + R*U[M+1])
  261.                    +T*(U[M+6] + R*(U[M+5] + R*U[M+4])));
  262.          END;
  263.       END;
  264.       IDT[7] := CLOCK - IT1;
  265.  
  266. {*********************************************************************}
  267.  
  268. {*** LOOP 8    P.D.E INTEGRATION }
  269.  
  270.       IT1 := CLOCK;
  271.       NL1 := 1;
  272.       NL2 := 2;
  273.       FOR K1 := 1 TO REPS DO BEGIN
  274.          FOR KX := 2 TO 3 DO BEGIN
  275.             FOR KY := 2 TO 21 DO BEGIN
  276.                DU1 := U1[KY+1,KX,NL1] - U1[KY-1,KX,NL1];
  277.                DU2 := U2[KY+1,KX,NL1] - U2[KY-1,KX,NL1];
  278.                DU3 := U3[KY+1,KX,NL1] - U3[KY-1,KX,NL1];
  279.                U1[KY,KX,NL2] := U1[KY,KX,NL1] + A11*DU1+A12*DU2 + A13*DU3 +
  280.                  SIG*(U1[KY,KX+1,NL1] - 2.*U1[KY,KX,NL1]+U1[KY,KX-1,NL1]);
  281.                U2[KY,KX,NL2] := U2[KY,KX,NL1] + A21*DU1+A22*DU2 + A23*DU3 +
  282.                  SIG*(U2[KY,KX+1,NL1] - 2.*U2[KY,KX,NL1]+U2[KY,KX-1,NL1]);
  283.                U3[KY,KX,NL2] := U3[KY,KX,NL1] + A31*DU1+A32*DU2 + A33*DU3 +
  284.                  SIG*(U3[KY,KX+1,NL1] - 2.*U3[KY,KX,NL1]+U3[KY,KX-1,NL1]);
  285.             END;
  286.          END;
  287.       END;
  288.       IDT[8] := CLOCK - IT1;
  289.  
  290. {*********************************************************************}
  291.  
  292. {*** LOOP 9    INTEGRATE PREDICTORS }
  293.  
  294.       FOR K := 1 TO 15 DO BEGIN
  295.          FOR L := 1 TO 100 DO BEGIN
  296.             PX[K,L] := L;
  297.             CX[K,L] := L;
  298.          END;
  299.       END;
  300.  
  301.       IT1 := CLOCK;
  302.       FOR K1 := 1 TO REPS DO BEGIN
  303.          FOR I := 1 TO 100 DO BEGIN
  304.             PX[1,I] := BM28*PX[13,I] + BM27*PX[12,I] + BM26*PX[11,I] +
  305.                        BM25*PX[10,I] + BM24*PX[9,I] + BM23*PX[8,I] +
  306.                        BM22*PX[7,I] + C0*(PX[5,I] + PX[6,I])+PX[3,I];
  307.          END;
  308.       END;
  309.       IDT[9] := CLOCK - IT1;
  310.  
  311. {*********************************************************************}
  312.  
  313. {*** LOOP 10   DIFFERENCE PREDICTORS }
  314.  
  315.       IT1 := CLOCK;
  316.       FOR K1 := 1 TO REPS DO BEGIN
  317.          FOR I := 1 TO 100 DO BEGIN
  318.             AR     :=      CX[5,I];
  319.             BR     := AR - PX[5,I];
  320.             PX[5,I]:= AR;
  321.             CR     := BR - PX[6,I];
  322.             PX[6,I]:= BR;
  323.             AR     := CR - PX[7,I];
  324.             PX[7,I]:= CR;
  325.             BR     := AR - PX[8,I];
  326.             PX[8,I]:= AR;
  327.             CR     := BR - PX[9,I];
  328.             PX[9,I]:= BR;
  329.             AR     := CR - PX[10,I];
  330.             PX[10,I]:=CR;
  331.             BR     := AR - PX[11,I];
  332.             PX[11,I]:=AR;
  333.             CR     := BR - PX[12,I];
  334.             PX[12,I]:=BR;
  335.             PX[14,I]:=CR - PX[13,I];
  336.             PX[13,I]:=CR;
  337.          END;
  338.       END;
  339.       IDT[10] := CLOCK - IT1;
  340.  
  341. {*********************************************************************}
  342.  
  343. {*** LOOP 11   FIRST SUM }
  344.  
  345.       IT1 := CLOCK;
  346.       FOR K1 := 1 TO REPS DO BEGIN
  347.          X[1] := Y[1];
  348.          FOR K := 2 TO 1000 DO BEGIN
  349.             X[K] := X[K-1]+Y[K];
  350.          END;
  351.       END;
  352.       IDT[11] := CLOCK - IT1;
  353.  
  354. {*********************************************************************}
  355.  
  356. {*** LOOP 12   FIRST DIFF. }
  357.  
  358.       IT1 := CLOCK;
  359.       FOR K1 := 1 TO REPS DO BEGIN
  360.          FOR K := 1 TO 999 DO BEGIN
  361.             X[K] := Y[K+1]-Y[K];
  362.          END;
  363.       END;
  364.       IDT[12] := CLOCK - IT1;
  365.  
  366. {*********************************************************************}
  367.  
  368. {*** LOOP 13   2-D PARTICLE PUSHER }
  369.  
  370.       IT1 := CLOCK;
  371.       FOR K1 := 1 TO REPS DO BEGIN
  372.          FOR J := 1 TO 4 DO BEGIN
  373.             FOR K := 1 TO 512 DO BEGIN
  374.                P[J,K] := 1.00025;
  375.             END;
  376.          END;
  377.          FOR IP := 1 TO 128 DO BEGIN
  378.             I1 := TRUNC (P[1,IP]);
  379.             J1 := TRUNC (P[2,IP]);
  380.             P[3,IP] := P[3,IP] + B[I1,J1];
  381.             P[4,IP] := P[4,IP] + C[I1,J1];
  382.             P[1,IP] := P[1,IP] + P[3,IP];
  383.             P[2,IP] := P[2,IP] + P[4,IP];
  384.             I2 := TRUNC (P[1,IP]);
  385.             J2 := TRUNC (P[2,IP]);
  386.             P[1,IP] := P[1,IP] + Y[I2+32];
  387.             P[2,IP] := P[2,IP] + Z[J2+32];
  388.             I2 := I2 + E[I2+32];
  389.             J2 := J2 + F[J2+32];
  390.             H[I2,J2] := H[I2,J2] + 1.0;
  391.          END;
  392.       END;
  393.       IDT[13] := CLOCK;
  394.       FOR K1 := 1 TO REPS DO BEGIN
  395.          FOR J := 1 TO 4 DO BEGIN
  396.             FOR K := 1 TO 512 DO BEGIN
  397.                P[J,K] := 1.00025;
  398.             END;
  399.          END;
  400.       END;
  401.       IDT[20] := CLOCK;
  402.       IZ13 := IDT[20] - IDT[13];
  403.       IDT[13] := 2*IDT[13] - IT1 - IDT[20];
  404.  
  405. {*********************************************************************}
  406.  
  407. {*** LOOP 14   1-D PARTICLE PUSHER }
  408.  
  409.       IT1 := CLOCK;
  410.       FOR K1 := 1 TO REPS DO BEGIN
  411.          FOR J := 1 TO 150 DO BEGIN
  412.             VX[J] := 0.001;
  413.             XX[J] := 0.001;
  414.          END;
  415.          FOR K := 1 TO 150 DO BEGIN
  416.             IX := 3+(K DIV 8);
  417.             XI := IX;
  418.             VX[K] := VX[K]+ EX[IX] + (XX[K]-XI) * DEX[IX];
  419.             XX[K] := XX[K]+ VX[K] + FLX;
  420.             IR := TRUNC(XX[K]);
  421.             RI := IR;
  422.             RX1:= XX[K]-RI;
  423.             IR := ABS (IR) AND 63;
  424.             XX[K]   := RI+RX1;
  425.             RH[IR]  := RH[IR] + 1.0 - RX1;
  426.             RH[IR+1]:= RH[IR+1] + RX1;
  427.          END;
  428.       END;
  429.       IDT[14] := CLOCK;
  430.       FOR K1 :=1 TO REPS DO BEGIN
  431.          FOR J := 1 TO 150 DO BEGIN
  432.             VX[J] := 0.001;
  433.             XX[J] := 0.001;
  434.          END;
  435.       END;
  436.       IDT[20] := CLOCK;
  437.       IZ14 := IDT[20] - IDT[14];
  438.       IDT[14] := 2*IDT[14] - IT1 - IDT[20];
  439.  
  440. {*********************************************************************}
  441.  
  442. {****TIME THE CLOCK CALL }
  443. {****CLOCK ROUTINE ARGUMENT IS MILLISECONDS }
  444.  
  445.       IT1 := CLOCK;
  446.       IDT[15] := CLOCK;
  447.       IDT[15] := IDT[15] - IT1;
  448.       NT := 14;
  449.          T := 0.0;
  450.          S := 0.0;
  451.          U[1] := 0.0;
  452.       FOR K := 1 TO NT DO BEGIN
  453.          RT[K] := IDT[K] - IDT[15];
  454.          T := T + RT[K];
  455.          MOPS [K] := NROPS [K] * LOOPS[K];
  456.          S := S + MOPS [K];
  457.          RPM [K] := 0.0;
  458.          IF RT[K] <> 0 THEN
  459.             RPM[K] := REPS*MOPS[K]/RT[K]/1000.0;
  460.          U[1] := U[1] + RPM[K];
  461.       END;
  462.       U[1] := U[1]/NT;
  463.       S := S/T;
  464.  
  465.       WRITELN ('LOOP  FLOPS      TIME   MFLOPS');
  466.       FOR K := 1 TO NT DO BEGIN
  467.          WRITELN (K:4, MOPS[K]:7, RT[K]:10:1, RPM [K]:9:4);
  468.       END;
  469.       WRITELN (#13,#10,'     AVERAGE MFLOPS =', U[1]:9:4);
  470.       WRITELN;
  471.       WRITELN (IZ13:10, IZ14:10);
  472.    END.
  473.  
  474.  
  475.  
  476.  
  477.